package receive_api

import (
	"encoding/json"
	"github.com/gin-gonic/gin"
	"time"
	"wecom_rebot/common"
	"wecom_rebot/common/http"
	"wecom_rebot/core"
	"wecom_rebot/models"
)

// ReceiveRequest 接收参数格式
type ReceiveRequest struct {
	Msgid   string   `json:"msgid" form:"msgid"`     // 消息id，消息的唯一标识，企业可以使用此字段进行消息去重。String类型
	Action  string   `json:"action" form:"action"`   // 消息动作，目前有send(发送消息)/recall(撤回消息)/switch(切换企业日志)三种类型。String类型
	From    string   `json:"from" form:"from"`       // 消息发送方id。同一企业内容为userid，非相同企业为external_userid。消息如果是机器人发出，也为external_userid。String类型
	Tolist  []string `json:"tolist" form:"tolist"`   // 消息接收方列表，可能是多个，同一个企业内容为userid，非相同企业为external_userid。数组，内容为string类型
	Roomid  string   `json:"roomid" form:"roomid"`   // 群聊消息的群id。如果是单聊则为空。String类型
	Msgtime int64    `json:"msgtime" form:"msgtime"` // 消息发送时间戳，utc时间，ms单位。
	Msgtype string   `json:"msgtype" form:"msgtype"` // 文本消息为：text。String类型
	Text    struct {
		Content string `json:"content"`
	} `json:"text" form:"text"` // 消息内容。String类型
}

func (ReceiveApi) ReceiveCreate(c *gin.Context) {
	var cr ReceiveRequest

	receiveLogger := core.InitLogger(common.LogsErrorMap[3])

	err := c.ShouldBindJSON(&cr)
	if err != nil {
		receiveLogger.Error(http.ErrorMap[http.ParamsError], err)
		http.FailWithError(err, &cr, c)
		return
	}
	// 记录参数日志
	receiveLogger.Info(&cr)

	// 1. 处理status逻辑
	status := 10 // 默认状态
	if cr.Roomid == "wrWGQCCQAAZimRyL3bF64zE-LniOkTiA" {
		status = 30 // 特殊状态判断
	}

	// 转换为队列任务
	payload, _ := json.Marshal(cr)

	job := &models.Job{
		Queue:       StringPointer("default"),
		Payload:     string(payload),
		Attempts:    0,
		Status:      status, // 设置状态
		AvailableAt: uint(time.Now().Unix()),
		CreatedAt:   uint(time.Now().Unix()),
	}

	result := common.DB.Create(&job).Error

	if result != nil {
		receiveLogger.Error(http.ErrorMap[http.CreateError], result)
		http.FailWithError(result, &cr, c)
		return
	}

	http.IsOkWithMessage("存入成功", c)
}

// StringPointer 辅助函数：字符串指针
func StringPointer(s string) *string {
	return &s
}
